
//poj1419
int n,m,cnt;
int g[maxn][maxn],f[maxn][maxn];
/*******************最大团模板分支限界法**************************/
void clique(int n,int* u,int mat[][maxn],int size,int& max,int& bb,int* res,int* rr,int* c) {
    int i, j, vn, v[maxn];
    if (n) {
        if (size + c[u[0]] <= max) return;
        //max <n-i + size 剩下可行解的最大可行性
        for (i = 0; i < n + size - max && i < n; ++i) {
            for (j = i + 1, vn = 0; j < n; ++j)
                if (mat[u[i]][u[j]]) v[vn++] = u[j];
            rr[size] = u[i];//记录第size个的解
            clique(vn, v, mat, size + 1, max, bb, res, rr, c);
            if (bb) return;
        }
    }
    else
    {
        if (size > max) {
        	max = size;
       		for (i = 0; i < size; ++i) res[i] = rr[i];
        	bb = 1;
  		}
    }
}

//传入mat 表示图，1表示有边，0表示无边，点标号从0->n-1，ret数组里面返回最大团的一个解
int maxclique(int n, int mat[][maxn], int *ret) {
    /* ret 数组为一个方案 */
    int max = 0, bb, c[maxn], i, j;
    int vn, v[maxn], rr[maxn];//rr暂时记录可行解
    for (c[i = n - 1] = 0; i >= 0; --i) {
        for (vn = 0, j = i + 1; j < n; ++j)
            if (mat[i][j]) v[vn++] = j;//v里面存的是可以被i访问的点
        bb = 0;//bb存的可行解数目
        rr[0] = i;
        clique(vn, v, mat, 1, max, bb, ret, rr, c);
        c[i] = max;//保存一i为根搜索的最大团的最大数目，在求最大团的时候达到剪枝目的
    }
    return max; /* 最大团大小 */
}
/*******************最大团模板分支限界法**************************/
int res[maxn];
int main()
{
	int i,j,t,k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		int x,y;
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g));
		for(i=0; i<m; i++)
		{
			scanf("%d%d",&x,&y);
			x--;y--;
			f[x][y]=f[y][x]=1;
		}
		for(i=0; i<n; i++)
		for(j=0; j<n;j++)
		if(f[i][j])
			g[i][j]=0;
		else
			g[i][j]=1;
		int ans=maxclique(n,g,res);
		printf("%d\n",ans);
		for(i=0; i<ans-1; i++)
			printf("%d ",res[i]+1);
		printf("%d\n",res[i]+1);
	}
}
